/*
  Grupo 2
  
  Luiz Felipe de Souza Mattos 	RA 107822
  
  Debora Maia Silva 	      	RA 101985

*/

#include <stdio.h>
#include <stdlib.h>
#include "heap.h"

/* insere na fila de prioridades passada como parametro o indice passado */
void InsereListaSimples(ListaSimples **lista,int indice)
{
	ListaSimples *novo,*aux;
	novo = (ListaSimples *)malloc(sizeof(ListaSimples));
	novo->indice = indice;
	novo->prox = NULL;

	if (*lista == NULL)
	{
		*lista = novo;
	}
	else
	{
		aux = *lista;
		while (aux->prox != NULL)
			aux = aux->prox;

		aux->prox = novo;
	}
}

/* inicializa o vetor da fila de prioridades */
void InicializaFila(Fila *fila,int tam)
{
	int i;

	for (i = 0;i < tam;i++)
		fila->lista[i] = NULL;
}

/* aloca e inicializa a fila de prioridades */
Fila * MontaFila(int tamanho)
{
	Fila *fila;

	fila = (Fila *)malloc(sizeof(Fila));
	fila->lista = (ListaSimples **)malloc(tamanho * sizeof(ListaSimples *));
	InicializaFila(fila,tamanho);

	return fila;
}

/* retorna o indice do elemento de maior prioridade da fila de prioridades */
int RetiraFila(Fila *fila,int tam)
{
	int i = 0,indice;
	ListaSimples *aux;

	while (fila->lista[i] == NULL)
	{
		i++;
		/* fila de prioridades vazia, retorna um flag para indicar */
		if (i == tam)
		{
			return -1;
		}
	}

	aux = fila->lista[i];
	fila->lista[i] = fila->lista[i]->prox;
	indice = aux->indice;
	free(aux);

	return indice;
}

/* libera a memoria usada pela fila de prioridades */
void LiberaFila(Fila **fila)
{
	if (*fila == NULL)
		return;

	free((*fila)->lista);
	free(*fila);
	*fila = NULL;
}
